{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# Simple Reinforcement Learning: Exploration Strategies\n",
    "This notebook contains implementations of various action-selections methods that can be used to encourage exploration during the learning process. To learn more about these methods, see the accompanying [Medium post](https://medium.com/p/d3a97b7cceaf/). Also see the interactive visualization: [here](http://awjuliani.github.io/exploration/index.html).\n",
    "\n",
    "For more reinforcment learning tutorials see:\n",
    "https://github.com/awjuliani/DeepRL-Agents"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "from __future__ import division\n",
    "\n",
    "import gym\n",
    "import numpy as np\n",
    "import random\n",
    "import tensorflow as tf\n",
    "import matplotlib.pyplot as plt\n",
    "%matplotlib inline\n",
    "\n",
    "import tensorflow.contrib.slim as slim"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Load the environment"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[2017-03-09 18:54:11,719] Making new env: CartPole-v0\n"
     ]
    }
   ],
   "source": [
    "env = gym.make('CartPole-v0')"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## The Deep Q-Network "
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Helper functions"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "class experience_buffer():\n",
    "    def __init__(self, buffer_size = 10000):\n",
    "        self.buffer = []\n",
    "        self.buffer_size = buffer_size\n",
    "    \n",
    "    def add(self,experience):\n",
    "        if len(self.buffer) + len(experience) >= self.buffer_size:\n",
    "            self.buffer[0:(len(experience)+len(self.buffer))-self.buffer_size] = []\n",
    "        self.buffer.extend(experience)\n",
    "            \n",
    "    def sample(self,size):\n",
    "        return np.reshape(np.array(random.sample(self.buffer,size)),[size,5])\n",
    "    \n",
    "def updateTargetGraph(tfVars,tau):\n",
    "    total_vars = len(tfVars)\n",
    "    op_holder = []\n",
    "    for idx,var in enumerate(tfVars[0:total_vars//2]):\n",
    "        op_holder.append(tfVars[idx+total_vars//2].assign((var.value()*tau) + ((1-tau)*tfVars[idx+total_vars//2].value())))\n",
    "    return op_holder\n",
    "\n",
    "def updateTarget(op_holder,sess):\n",
    "    for op in op_holder:\n",
    "        sess.run(op)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Implementing the network itself"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {
    "collapsed": false
   },
   "outputs": [],
   "source": [
    "class Q_Network():\n",
    "    def __init__(self):\n",
    "        #These lines establish the feed-forward part of the network used to choose actions\n",
    "        self.inputs = tf.placeholder(shape=[None,4],dtype=tf.float32)\n",
    "        self.Temp = tf.placeholder(shape=None,dtype=tf.float32)\n",
    "        self.keep_per = tf.placeholder(shape=None,dtype=tf.float32)\n",
    "\n",
    "        hidden = slim.fully_connected(self.inputs,64,activation_fn=tf.nn.tanh,biases_initializer=None)\n",
    "        hidden = slim.dropout(hidden,self.keep_per)\n",
    "        self.Q_out = slim.fully_connected(hidden,2,activation_fn=None,biases_initializer=None)\n",
    "        \n",
    "        self.predict = tf.argmax(self.Q_out,1)\n",
    "        self.Q_dist = tf.nn.softmax(self.Q_out/self.Temp)\n",
    "        \n",
    "        \n",
    "        #Below we obtain the loss by taking the sum of squares difference between the target and prediction Q values.\n",
    "        self.actions = tf.placeholder(shape=[None],dtype=tf.int32)\n",
    "        self.actions_onehot = tf.one_hot(self.actions,2,dtype=tf.float32)\n",
    "        \n",
    "        self.Q = tf.reduce_sum(tf.multiply(self.Q_out, self.actions_onehot), reduction_indices=1)\n",
    "        \n",
    "        self.nextQ = tf.placeholder(shape=[None],dtype=tf.float32)\n",
    "        loss = tf.reduce_sum(tf.square(self.nextQ - self.Q))\n",
    "        trainer = tf.train.GradientDescentOptimizer(learning_rate=0.0005)\n",
    "        self.updateModel = trainer.minimize(loss)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Training the network"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": [
    "# Set learning parameters\n",
    "exploration = \"e-greedy\" #Exploration method. Choose between: greedy, random, e-greedy, boltzmann, bayesian.\n",
    "y = .99 #Discount factor.\n",
    "num_episodes = 20000 #Total number of episodes to train network for.\n",
    "tau = 0.001 #Amount to update target network at each step.\n",
    "batch_size = 32 #Size of training batch\n",
    "startE = 1 #Starting chance of random action\n",
    "endE = 0.1 #Final chance of random action\n",
    "anneling_steps = 200000 #How many steps of training to reduce startE to endE.\n",
    "pre_train_steps = 50000 #Number of steps used before training updates begin."
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": false,
    "scrolled": false
   },
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "WARNING:tensorflow:From <ipython-input-6-acb8f3cbe604>:6: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.\n",
      "Instructions for updating:\n",
      "Use `tf.global_variables_initializer` instead.\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "[2017-03-09 18:54:14,158] From <ipython-input-6-acb8f3cbe604>:6: initialize_all_variables (from tensorflow.python.ops.variables) is deprecated and will be removed after 2017-03-02.\n",
      "Instructions for updating:\n",
      "Use `tf.global_variables_initializer` instead.\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Mean Reward: 23.46 Total Steps: 2358 e: 1\n",
      "Mean Reward: 22.23 Total Steps: 4581 e: 1\n",
      "Mean Reward: 22.61 Total Steps: 6842 e: 1\n",
      "Mean Reward: 21.64 Total Steps: 9006 e: 1\n",
      "Mean Reward: 23.01 Total Steps: 11307 e: 1\n",
      "Mean Reward: 24.09 Total Steps: 13716 e: 1\n",
      "Mean Reward: 22.26 Total Steps: 15942 e: 1\n",
      "Mean Reward: 22.47 Total Steps: 18189 e: 1\n",
      "Mean Reward: 22.46 Total Steps: 20435 e: 1\n",
      "Mean Reward: 21.97 Total Steps: 22632 e: 1\n",
      "Mean Reward: 23.53 Total Steps: 24985 e: 1\n",
      "Mean Reward: 23.7 Total Steps: 27355 e: 1\n",
      "Mean Reward: 23.16 Total Steps: 29671 e: 1\n",
      "Mean Reward: 22.42 Total Steps: 31913 e: 1\n",
      "Mean Reward: 21.51 Total Steps: 34064 e: 1\n",
      "Mean Reward: 21.57 Total Steps: 36221 e: 1\n",
      "Mean Reward: 22.52 Total Steps: 38473 e: 1\n",
      "Mean Reward: 23.16 Total Steps: 40789 e: 1\n",
      "Mean Reward: 22.9 Total Steps: 43079 e: 1\n",
      "Mean Reward: 22.45 Total Steps: 45324 e: 1\n",
      "Mean Reward: 21.96 Total Steps: 47520 e: 1\n",
      "Mean Reward: 21.72 Total Steps: 49692 e: 1\n",
      "Mean Reward: 20.22 Total Steps: 51714 e: 0.9922915\n",
      "Mean Reward: 20.32 Total Steps: 53746 e: 0.9831475\n",
      "Mean Reward: 22.06 Total Steps: 55952 e: 0.9732205\n",
      "Mean Reward: 23.03 Total Steps: 58255 e: 0.962857\n",
      "Mean Reward: 22.59 Total Steps: 60514 e: 0.9526915\n",
      "Mean Reward: 21.24 Total Steps: 62638 e: 0.9431335\n",
      "Mean Reward: 22.51 Total Steps: 64889 e: 0.933004000001\n",
      "Mean Reward: 25.05 Total Steps: 67394 e: 0.921731500001\n",
      "Mean Reward: 23.19 Total Steps: 69713 e: 0.911296000001\n",
      "Mean Reward: 26.61 Total Steps: 72374 e: 0.899321500001\n",
      "Mean Reward: 25.18 Total Steps: 74892 e: 0.887990500001\n",
      "Mean Reward: 25.87 Total Steps: 77479 e: 0.876349000001\n",
      "Mean Reward: 29.7 Total Steps: 80449 e: 0.862984000001\n",
      "Mean Reward: 30.84 Total Steps: 83533 e: 0.849106000001\n",
      "Mean Reward: 34.07 Total Steps: 86940 e: 0.833774500001\n",
      "Mean Reward: 36.39 Total Steps: 90579 e: 0.817399000002\n",
      "Mean Reward: 33.12 Total Steps: 93891 e: 0.802495000002\n",
      "Mean Reward: 35.4 Total Steps: 97431 e: 0.786565000002\n",
      "Mean Reward: 32.98 Total Steps: 100729 e: 0.771724000002\n",
      "Mean Reward: 39.89 Total Steps: 104718 e: 0.753773500002\n",
      "Mean Reward: 43.53 Total Steps: 109071 e: 0.734185000002\n",
      "Mean Reward: 43.16 Total Steps: 113387 e: 0.714763000002\n",
      "Mean Reward: 47.85 Total Steps: 118172 e: 0.693230500003\n",
      "Mean Reward: 48.49 Total Steps: 123021 e: 0.671410000003\n"
     ]
    }
   ],
   "source": [
    "tf.reset_default_graph()\n",
    "\n",
    "q_net = Q_Network()\n",
    "target_net = Q_Network()\n",
    "\n",
    "init = tf.initialize_all_variables()\n",
    "trainables = tf.trainable_variables()\n",
    "targetOps = updateTargetGraph(trainables,tau)\n",
    "myBuffer = experience_buffer()\n",
    "\n",
    "\n",
    "#create lists to contain total rewards and steps per episode\n",
    "jList = []\n",
    "jMeans = []\n",
    "rList = []\n",
    "rMeans = []\n",
    "with tf.Session() as sess:\n",
    "    sess.run(init)\n",
    "    updateTarget(targetOps,sess)\n",
    "    e = startE\n",
    "    stepDrop = (startE - endE)/anneling_steps\n",
    "    total_steps = 0\n",
    "    \n",
    "    for i in range(num_episodes):\n",
    "        s = env.reset()\n",
    "        rAll = 0\n",
    "        d = False\n",
    "        j = 0\n",
    "        while j < 999:\n",
    "            j+=1\n",
    "            if exploration == \"greedy\":\n",
    "                #Choose an action with the maximum expected value.\n",
    "                a,allQ = sess.run([q_net.predict,q_net.Q_out],feed_dict={q_net.inputs:[s],q_net.keep_per:1.0})\n",
    "                a = a[0]\n",
    "            if exploration == \"random\":\n",
    "                #Choose an action randomly.\n",
    "                a = env.action_space.sample()\n",
    "            if exploration == \"e-greedy\":\n",
    "                #Choose an action by greedily (with e chance of random action) from the Q-network\n",
    "                if np.random.rand(1) < e or total_steps < pre_train_steps:\n",
    "                    a = env.action_space.sample()\n",
    "                else:\n",
    "                    a,allQ = sess.run([q_net.predict,q_net.Q_out],feed_dict={q_net.inputs:[s],q_net.keep_per:1.0})\n",
    "                    a = a[0]\n",
    "            if exploration == \"boltzmann\":\n",
    "                #Choose an action probabilistically, with weights relative to the Q-values.\n",
    "                Q_d,allQ = sess.run([q_net.Q_dist,q_net.Q_out],feed_dict={q_net.inputs:[s],q_net.Temp:e,q_net.keep_per:1.0})\n",
    "                a = np.random.choice(Q_d[0],p=Q_d[0])\n",
    "                a = np.argmax(Q_d[0] == a)\n",
    "            if exploration == \"bayesian\":\n",
    "                #Choose an action using a sample from a dropout approximation of a bayesian q-network.\n",
    "                a,allQ = sess.run([q_net.predict,q_net.Q_out],feed_dict={q_net.inputs:[s],q_net.keep_per:(1-e)+0.1})\n",
    "                a = a[0]\n",
    "                \n",
    "            #Get new state and reward from environment\n",
    "            s1,r,d,_ = env.step(a)\n",
    "            myBuffer.add(np.reshape(np.array([s,a,r,s1,d]),[1,5]))\n",
    "            \n",
    "            if e > endE and total_steps > pre_train_steps:\n",
    "                e -= stepDrop\n",
    "            \n",
    "            if total_steps > pre_train_steps and total_steps % 5 == 0:\n",
    "                #We use Double-DQN training algorithm\n",
    "                trainBatch = myBuffer.sample(batch_size)\n",
    "                Q1 = sess.run(q_net.predict,feed_dict={q_net.inputs:np.vstack(trainBatch[:,3]),q_net.keep_per:1.0})\n",
    "                Q2 = sess.run(target_net.Q_out,feed_dict={target_net.inputs:np.vstack(trainBatch[:,3]),target_net.keep_per:1.0})\n",
    "                end_multiplier = -(trainBatch[:,4] - 1)\n",
    "                doubleQ = Q2[range(batch_size),Q1]\n",
    "                targetQ = trainBatch[:,2] + (y*doubleQ * end_multiplier)\n",
    "                _ = sess.run(q_net.updateModel,feed_dict={q_net.inputs:np.vstack(trainBatch[:,0]),q_net.nextQ:targetQ,q_net.keep_per:1.0,q_net.actions:trainBatch[:,1]})\n",
    "                updateTarget(targetOps,sess)\n",
    "\n",
    "            rAll += r\n",
    "            s = s1\n",
    "            total_steps += 1\n",
    "            if d == True:\n",
    "                break\n",
    "        jList.append(j)\n",
    "        rList.append(rAll)\n",
    "        if i % 100 == 0 and i != 0:\n",
    "            r_mean = np.mean(rList[-100:])\n",
    "            j_mean = np.mean(jList[-100:])\n",
    "            if exploration == 'e-greedy':\n",
    "                print(\"Mean Reward: \" + str(r_mean) + \" Total Steps: \" + str(total_steps) + \" e: \" + str(e))\n",
    "            if exploration == 'boltzmann':\n",
    "                print(\"Mean Reward: \" + str(r_mean) + \" Total Steps: \" + str(total_steps) + \" t: \" + str(e))\n",
    "            if exploration == 'bayesian':\n",
    "                print(\"Mean Reward: \" + str(r_mean) + \" Total Steps: \" + str(total_steps) + \" p: \" + str(e))\n",
    "            if exploration == 'random' or exploration == 'greedy':\n",
    "                print(\"Mean Reward: \" + str(r_mean) + \" Total Steps: \" + str(total_steps))\n",
    "            rMeans.append(r_mean)\n",
    "            jMeans.append(j_mean)\n",
    "print(\"Percent of succesful episodes: \" + str(sum(rList)/num_episodes) + \"%\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### Some statistics on network performance"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x1128a6490>]"
      ]
     },
     "execution_count": 7,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x112858ed0>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(rMeans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {
    "collapsed": false,
    "scrolled": true
   },
   "outputs": [
    {
     "data": {
      "text/plain": [
       "[<matplotlib.lines.Line2D at 0x115d9b250>]"
      ]
     },
     "execution_count": 8,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<matplotlib.figure.Figure at 0x112883950>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "plt.plot(jMeans)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {
    "collapsed": true
   },
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "anaconda-cloud": {},
  "kernelspec": {
   "display_name": "Python [conda env:py2]",
   "language": "python",
   "name": "conda-env-py2-py"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.13"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 0
}
